﻿/*
* 炉啊.h
* 本项目是汉化lua源码的一部分,
* 本人一方面练习C积累程序编写代码量,
* 一方面临摹解释器和虚拟机代码,学习相关实现过程.
* 本项目会大面积使用汉字标识符描述程序文体(代表程序的符号).
*/

#ifndef 炉啊_喝
#define 炉啊_喝

#include <stdarg.h>
#include <stddef.h>

#include "炉啊配置.h"

#define 炉啊_版本_少校  "5"
#define 炉啊_版本_辅修  "4"
#define 炉啊_版本_释放  "0"

#define 炉啊_版本_号    504
#define 炉啊_版本_释放_号   (炉啊_版本_号 * 100 + 0)

#define 炉啊_版本  "炉啊 " 炉啊_版本_少校 "." 炉啊_版本_辅修
#define 炉啊_释放  炉啊_版本 "." 炉啊_版本_释放
#define 炉啊_版权  炉啊_释放 " 仅供学习使用"
#define 炉啊_授权  "本人github: qwas982"

/*标记预编译代码 ('<esc>炉啊')*/
#define 炉啊_署名 "\x1b炉啊"

/*选项为多重返回在 '炉啊_匹调用' 与 '炉啊_调用' 中 */
#define 炉啊_多重返回 (-1)

/*
* 假冒索引
* (-炉啊艾_最大栈是最小有效索引;
*  我们保留一些空闲空间去帮助溢出检测)
*/
#define 炉啊_寄存器索引 (-炉啊艾_最大栈 - 1000)
#define 炉啊_上值索引 (艾) (炉啊_寄存器索引 - (艾))

/* 线程状态 */
#define 炉啊_可行    0
#define 炉啊_产出    1
#define 炉啊_错跑    2
#define 炉啊_错句法  3
#define 炉啊_错内存  4
#define 炉啊_错错    5

typedef struct 炉啊_国 炉啊_国;

/*
* 基本类型
*/
#define 炉啊_类型没有    (-1)

#define 炉啊_类型无      0
#define 炉啊_类型布尔    1
#define 炉啊_类型光照用户数据  2
#define 炉啊_类型号码     3
#define 炉啊_类型串       4
#define 炉啊_类型表       5
#define 炉啊_类型函数     6
#define 炉啊_类型用户数据   7
#define 炉啊_类型线程     8

#define 炉啊_号类型       9

/* 最小炉啊栈可用于一个C函数 */
#define 炉啊_最小栈    20

/* 预定义值在寄存器内 */
#define 炉啊_寄存索引数据_主线程  1
#define 炉啊_寄存索引数据_全局    2
#define 炉啊_寄存索引数据_最后    炉啊_寄存索引数据_全局

/* 炉啊中的号码类型 */
typedef 炉啊_号码 炉啊_号码;

/* 整数函数类型 */
typedef 炉啊_整数 炉啊_整数;

/* 无符整数类型 */
typedef 炉啊_无符 炉啊_无符;

/* 继续函数上下文类型 */
typedef 炉啊_颗上下文 炉啊_颗上下文

/* C函数寄存与炉啊类型 */
typedef int (*炉啊_西函数) (炉啊_国* 嘞)

/* 继续函数类型 */
typedef int (*炉啊_颗函数) (炉啊_国* 嘞, int 状态, 炉啊_颗上下文 西嚏斯)

/* 当加载/转储炉啊大块时读/写街块函数类型 */
typedef const char* (*炉啊_读者) (炉啊_国* 嘞, void* 由迪, size_t* 大小);

typedef int (*炉啊_作者) (炉啊_国* 嘞, const void *针, size_t 大小, void* 由迪);

/* 内存分配函数类型 */
typedef void* (*炉啊_分配) (void* 由迪, void* 指针, size_t 欧大小, size_t 恩大小);

/* 警告函数类型 */
typedef void (*炉啊_警告函数) (void* 由迪, const char* 消息, int 到语境);


/* 通用额外包括文件 */
#if defined(炉啊_用户_喝)
#include 炉啊_用户_喝
#endif

/* RCS识别串 */
extern const char 炉啊_识别[];

/* 国操纵 */
炉啊_应用程序接口 炉啊_国* (炉啊_新国)(炉啊_分配 弗, void* 由迪);
炉啊_应用程序接口 void      (炉啊_关闭)(炉啊_国* 嘞);
炉啊_应用程序接口 炉啊_国* (炉啊_新线程)(炉啊_国* 嘞);
炉啊_应用程序接口 int       (炉啊_重置线程)(炉啊_国* 嘞);

炉啊_应用程序接口 炉啊_西函数(炉啊_在恐慌)(炉啊_国* 嘞, 炉啊_西函数 恐慌弗);

炉啊_应用程序接口 炉啊_号码(炉啊_版本)(炉啊_国* 嘞);

/* 基本栈操纵 */
炉啊_应用程序接口 int (炉啊_抽象索引)(炉啊_国* 嘞, int 小索引);
炉啊_应用程序接口 int (炉啊_取顶)(炉啊_国* 嘞);
炉啊_应用程序接口 void (炉啊_放置顶)(炉啊_国* 嘞, int 小索引);
炉啊_应用程序接口 void (炉啊_推值)(炉啊_国* 嘞, int 小索引);
炉啊_应用程序接口 void (炉啊_旋转)(炉啊_国* 嘞, int 小索引, int 恩);
炉啊_应用程序接口 void (炉啊_复制)(炉啊_国* 嘞, int 来自索引, int 到索引);
炉啊_应用程序接口 int (炉啊_检查栈)(炉啊_国* 嘞, int 恩);
炉啊_应用程序接口 void (炉啊_斯移)(炉啊_国* 来自, 炉啊_国* 到, int 恩);

/* 访问函数 ( 栈 -> C) */
炉啊_应用程序接口 int (炉啊_是否号码)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 int (炉啊_是否串)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 int (炉啊_是否西函数)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 int (炉啊_是否整数)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 int (炉啊_是否用户数据)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 int (炉啊_类型)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 const char* (炉啊_类型名)(炉啊_国* 嘞, int 类型);

炉啊_应用程序接口 炉啊_号码 (炉啊_到号码去)(炉啊_国* 嘞, int 索引, int* 是否号);
炉啊_应用程序接口 炉啊_整数 (炉啊_到整数去)(炉啊_国* 嘞, int 索引, int* 是否号);
炉啊_应用程序接口 int       (炉啊_到布尔)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 const char* (炉啊_到长串)(炉啊_国* 嘞, int 索引, size_t* 长度);
炉啊_应用程序接口 炉啊_无符号 (炉啊_原始长)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 炉啊_西函数 (炉啊_到西函数)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 void*       (炉啊_到用户数据)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 炉啊_国*    (炉啊_到线程)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 const void   (炉啊_到指针)(炉啊_国* 嘞, int 索引);

/* 对比 与 算术函数 */
#define 炉啊_操作加    0  /*顺序tm ,顺序操作*/
#define 炉啊_操作减    1
#define 炉啊_操作乘    2
#define 炉啊_操作余数    3
#define 炉啊_操作幂    4
#define 炉啊_操作除    5
#define 炉啊_操作符号除    6
#define 炉啊_操作位与    7
#define 炉啊_操作位或    8
#define 炉啊_操作位异或    9
#define 炉啊_操作左移    10
#define 炉啊_操作右移    11
#define 炉啊_操作负    12
#define 炉啊_操作位非    13

炉啊_应用程序接口 void (炉啊_算术)(炉啊_国* 嘞, int 操作);

#define 炉啊_操作相等    0
#define 炉啊_操作小于    1
#define 炉啊_操作小等    2

炉啊_应用程序接口 int (炉啊_原始相等)(炉啊_国* 嘞, int 索引1, int 索引2);
炉啊_应用程序接口 int (炉啊_对比)(炉啊_国* 嘞, int 索引1, int 索引2, int 操作);

/* 推函数 (C -> 栈) */
炉啊_应用程序接口 void (炉啊_推无)(炉啊_国* 嘞);
炉啊_应用程序接口 void (炉啊_推号码)(炉啊_国* 嘞,炉啊_号码 恩);
炉啊_应用程序接口 void (炉啊_推整数)(炉啊_国* 嘞,炉啊_整数 恩);
炉啊_应用程序接口 const char (炉啊_推嘞串)(炉啊_国* 嘞,const char *串,size_t 长);
炉啊_应用程序接口 const char (炉啊_推串)(炉啊_国* 嘞,const char *串);
炉啊_应用程序接口 const char (炉啊_推可变格式串)(炉啊_国* 嘞,const char *格式,可变_列 参匹);

炉啊_应用程序接口 const char (炉啊_推格式串)(炉啊_国* 嘞,const char *格式, ...);
炉啊_应用程序接口 void (炉啊_推西闭包)(炉啊_国* 嘞,炉啊_西函数 函,int 恩);
炉啊_应用程序接口 void (炉啊_推布尔)(炉啊_国* 嘞,int 哔);
炉啊_应用程序接口 void (炉啊_推光照用户数据)(炉啊_国* 嘞,void *匹);
炉啊_应用程序接口 int  (炉啊_推线程)(炉啊_国* 嘞);

/* 取函数 (炉啊 -> 栈) */
炉啊_应用程序接口 int (炉啊_取全局)(炉啊_国* 嘞, const char *名字 );
炉啊_应用程序接口 int (炉啊_取表)(炉啊_国* 嘞,int 索引 );
炉啊_应用程序接口 int (炉啊_取字段)(炉啊_国* 嘞,int 索引,const char *颗 );
炉啊_应用程序接口 int (炉啊_取艾)(炉啊_国* 嘞,int 索引,炉啊_整数 恩 );
炉啊_应用程序接口 int (炉啊_原始取)(炉啊_国* 嘞,int 索引 );
炉啊_应用程序接口 int (炉啊_原始取艾)(炉啊_国* 嘞,int 索引,炉啊_整数 恩);
炉啊_应用程序接口 int (炉啊_原始取匹)(炉啊_国* 嘞, int 索引, const void* 匹);

炉啊_应用程序接口 void (炉啊_创建表)(炉啊_国* 嘞,int 恩数组,int 恩收到 );
炉啊_应用程序接口 void *(炉啊_新用户数据用户值)(炉啊_国* 嘞,size_t 大小,int 新用户值 );
炉啊_应用程序接口 int (炉啊_取元表)(炉啊_国* 嘞, int 对象索引);
炉啊_应用程序接口 int (炉啊_取艾用户值)(炉啊_国* 嘞,int 索引,int 恩 );

/* 设置函数 (栈 ->炉啊) */
炉啊_应用程序接口 void (炉啊_设置全局)(炉啊_国* 嘞, const char *名字);
炉啊_应用程序接口 void (炉啊_设置表)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 void (炉啊_设置字段)(炉啊_国* 嘞, int 索引,const char *颗);
炉啊_应用程序接口 void (炉啊_设置艾)(炉啊_国* 嘞, int 索引,炉啊_整数 恩);
炉啊_应用程序接口 void (炉啊_原始设置)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 void (炉啊_原始设置艾)(炉啊_国* 嘞, int 索引,炉啊_整数 恩);
炉啊_应用程序接口 void (炉啊_原始设置匹)(炉啊_国* 嘞, int 索引,const void *匹);
炉啊_应用程序接口 int (炉啊_设置元表)(炉啊_国* 嘞, int 对象索引);
炉啊_应用程序接口 int (炉啊_设置艾用户值)(炉啊_国* 嘞, int 索引,int 恩);

/* '加载' 与 '调用' 函数 (加载与跑炉啊代码) */
炉啊_应用程序接口 void (炉啊_调用颗)(炉啊_国* 嘞, int 恩参, int 恩结果, 炉啊_颗上下文 上下文, 炉啊_颗函数 颗);

#define 炉啊_调用(嘞,恩,日)    炉啊_调用颗(嘞,(恩),(日),0,NULL)

炉啊_应用程序接口 int (炉啊_匹调用颗)(炉啊_国* 嘞, int 恩参, int 恩结果, int 错函, 炉啊_颗上下文 上下文, 炉啊_颗函数 颗);

#define 炉啊_匹调用(嘞,恩,日,弗)    炉啊_匹调用颗(嘞,(恩),(日),(弗),0,NULL)

炉啊_应用程序接口 int (炉啊_加载)(炉啊_国* 嘞, 炉啊_读者 读者, void* 迪嚏, const char* 大块名, const char* 模式);

炉啊_应用程序接口 int (炉啊_转储)(炉啊_国* 嘞, 炉啊_作者 作者, void* 数据, int 脱掉);

/* 协程函数 */
炉啊_应用程序接口 int (炉啊_产出颗) (炉啊_国* 嘞, int 恩结果, 炉啊_颗上下文 上下文, 炉啊_颗函数 颗);
炉啊_应用程序接口 int (炉啊_恢复) (炉啊_国* 嘞, 炉啊_国* 来自, int 恩参, int* 恩恢复);
炉啊_应用程序接口 int (炉啊_状态) (炉啊_国* 嘞);
炉啊_应用程序接口 int (炉啊_是否能产出) (炉啊_国* 嘞);

#define 炉啊_产出(嘞,恩)    炉啊_产出颗(嘞,(恩),0,NULL)

/* 警告叙述函数 */
炉啊_应用程序接口 void (炉啊_设置警弗)(炉啊_国* 嘞, 炉啊_警函数 弗, void* 由迪);
炉啊_应用程序接口 void (炉啊_警告)(炉啊_国* 嘞, const char* 消息, int 到上下文);

/* 垃圾收集函数与选项 */
#define 炉啊_垃圾收集停          0
#define 炉啊_垃圾收集重新开始    1
#define 炉啊_垃圾收集收集        2
#define 炉啊_垃圾收集计数        3
#define 炉啊_垃圾收集计数哔      4
#define 炉啊_垃圾收集步          5
#define 炉啊_垃圾收集设置暂停    6
#define 炉啊_垃圾收集设置步乘    7
#define 炉啊_垃圾收集是否正在跑    9
#define 炉啊_垃圾收集生成        10
#define 炉啊_垃圾收集增加        11

炉啊_应用程序接口 int (炉啊_垃圾收集)(炉啊_国* 嘞, int 什么, ...);


/* 混杂函数 */
炉啊_应用程序接口 int  (炉啊_错误)(炉啊_国* 嘞);
炉啊_应用程序接口 int  (炉啊_下一个)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 void  (炉啊_合并)(炉啊_国* 嘞, int 恩);
炉啊_应用程序接口 void  (炉啊_长)(炉啊_国* 嘞, int 索引);
炉啊_应用程序接口 size_t  (炉啊_串到号码)(炉啊_国* 嘞, const char* 丝);
炉啊_应用程序接口 炉啊_分配  (炉啊_取分配弗)(炉啊_国* 嘞, void** 由迪);
炉啊_应用程序接口 void  (炉啊_设置分配弗)(炉啊_国* 嘞, 炉啊_分配 弗, void* 由迪);
炉啊_应用程序接口 void  (炉啊_到关闭)(炉啊_国* 嘞, int 索引);

/* 一些可用宏 */
#define 炉啊_取额外空间(嘞)   ((void*)((char *)(嘞) - 炉啊_额外空间))
#define 炉啊_到号码(嘞,艾)    炉啊_到号码斯(嘞,(艾),NULL)
#define 炉啊_到整数(嘞,艾)    炉啊_到整数斯(嘞,(艾),NULL)
#define 炉啊_弹(嘞,恩)        炉啊_设置顶部(嘞,-(恩)-1)
#define 炉啊_新表(嘞)         炉啊_创建表(嘞,0,0)
#define 炉啊_寄存器(嘞,恩,弗)    (炉啊_推西函数(嘞,(弗)),炉啊_设置全局(嘞,(恩)))
#define 炉啊_推西函数(嘞,弗)     炉啊_推西闭包(嘞,(弗),0)
#define 炉啊_是否函数(嘞,恩)     (炉啊_类型(嘞,(恩)) == 炉啊_嚏函数)
#define 炉啊_是否表(嘞,恩)        (炉啊_类型(嘞,(恩)) == 炉啊_嚏表)
#define 炉啊_是否光照用户数据(嘞,恩)      (炉啊_类型(嘞,(恩)) == 炉啊_嚏光照用户数据)
#define 炉啊_是否无(嘞,恩)         (炉啊_类型(嘞,(恩)) == 炉啊_嚏无)
#define 炉啊_是否布尔(嘞,恩)       (炉啊_类型(嘞,(恩)) == 炉啊_嚏布尔)
#define 炉啊_是否线程(嘞,恩)       (炉啊_类型(嘞,(恩)) == 炉啊_嚏线程)
#define 炉啊_是否没有(嘞,恩)       (炉啊_类型(嘞,(恩)) == 炉啊_嚏没有)
#define 炉啊_是否没有或无(嘞,恩)   (炉啊_类型(嘞,(恩)) <= 0)
#define 炉啊_推字面值(嘞,丝)       炉啊_推串(嘞,"" 丝)
#define 炉啊_推全局表(嘞)  ((void)炉啊_原始取艾(嘞,炉啊_寄存器索引,炉啊_寄存器索引数据斯_全局))
#define 炉啊_到串(嘞,艾)   炉啊_到嘞串(嘞,(艾),NULL)
#define 炉啊_插入(嘞,索引)  炉啊_旋转(嘞,(索引),1)
#define 炉啊_移除(嘞,索引) (炉啊_旋转(嘞,(索引),-1),炉啊_弹(嘞,1))
#define 炉啊_替换(嘞,索引) (炉啊_复制(嘞,-1,(索引)),炉啊_弹(嘞,1))

/* 兼容性宏 */
#if defined(炉啊_兼容_应用程序接口整型投射)
#define 炉啊_推无符号(嘞,恩)   炉啊_推整数(嘞,(炉啊_整数)(恩))
#define 炉啊_到无符号斯(嘞,艾,是)  ((炉啊_无符号)炉啊_到整数斯(嘞,艾,是))
#define 炉啊_到无符号(嘞,艾)     炉啊_到无符号斯(嘞,(艾),NULL)

#endif

#define 炉啊_新用户数据(嘞,丝)  炉啊_新用户数据用户值(嘞,丝,1)
#define 炉啊_取用户值(嘞,索引)  炉啊_取艾用户值(嘞,索引,1)
#define 炉啊_设置用户值(嘞,索引)   炉啊_设置艾用户值(嘞,索引,1)
#define 炉啊_号签     炉啊_号类型

/* 调试 应用程序接口 */
/* 事件代码 */
#define 炉啊_钩子调用  0
#define 炉啊_钩子返回  1
#define 炉啊_钩子行    2
#define 炉啊_钩子计数  3
#define 炉啊_钩子尾调用  4

/* 事件口罩 */
#define 炉啊_口罩调用    (1 << 炉啊_钩子调用)
#define 炉啊_口罩返回    (1 << 炉啊_钩子返回)
#define 炉啊_口罩行      (1 << 炉啊_钩子行)
#define 炉啊_口罩计数    (1 << 炉啊_钩子计数)

typedef struct 炉啊_调试 炉啊_调试;   /* 活动记录 */

/* 在特定事件中由调试器调用的函数 */
typedef void (*炉啊_钩子) (炉啊_国* 嘞, 炉啊_调试* 啊日);

炉啊_应用程序接口 int (炉啊_取栈) (炉啊_国* 嘞, int 级, 炉啊_调试* 啊日);
炉啊_应用程序接口 int (炉啊_取信息) (炉啊_国* 嘞, const char* 什么, 炉啊_调试* 啊日);
炉啊_应用程序接口 const int* (炉啊_取本地) (炉啊_国* 嘞, const 炉啊_调试* 啊日, int 恩);
炉啊_应用程序接口 const int* (炉啊_设置本地) (炉啊_国* 嘞, const 炉啊_调试* 啊日, int 恩);
炉啊_应用程序接口 const int* (炉啊_取上值) (炉啊_国* 嘞, int 函索引, int 恩);
炉啊_应用程序接口 const int* (炉啊_设置上值) (炉啊_国* 嘞, int 函索引, int 恩);

炉啊_应用程序接口 void* (炉啊_上值身份) (炉啊_国* 嘞, int 弗索引, int 恩);
炉啊_应用程序接口 void (炉啊_上值加入) (炉啊_国* 嘞, int 弗索引1, int 恩1, int 弗索引2, int 恩2);

炉啊_应用程序接口 void (炉啊_设置钩子) (炉啊_国* 嘞, 炉啊_钩子 函, int 口罩, int 计数);
炉啊_应用程序接口 炉啊_钩子(炉啊_取钩子) (炉啊_国* 嘞);
炉啊_应用程序接口 int (炉啊_取钩子口罩) (炉啊_国* 嘞);
炉啊_应用程序接口 int (炉啊_取钩子计数) (炉啊_国* 嘞);

炉啊_应用程序接口 int (炉啊_设置西栈界限) (炉啊_国* 嘞, unsigned int 界限);

struct 炉啊_调试 {
	int 事件;  
	const char* 名字; /* (恩) */
	const char* 名字什么; /* (恩) '全局','本地','字段','方法' */
	const char* 什么; /* (丝) '炉啊','西','主','尾' */
	const char* 源; /* (丝)  */
	size_t 源长; /* (丝)  */
	int 当前行; /* (嘞)  */
	int 行定义; /* (丝)  */
	int 最后行定义; /* (丝)  */
	unsigned char 上值号码; /* (由)上值号码  */
	unsigned char 形参号码; /* (由)形参号码  */
	char 是否变参;          /* (由)  */
	char 是否尾调用;        /* (嚏)  */
	unsigned short 弗转移;  /* (日)第一值转移索引  */
	unsigned short 恩转移;  /* (日)转移值号码  */
	char 短_源[炉啊_身份大小];  /* (丝)  */
	/* 私有部分  */
	struct 调用信息* 艾_调信; /* 活动函数  */

};

/* 
* 版权 2020 炉啊
* 在此准许任何人免费获得*
本软件及相关文档文件的副本
*“软件”)，可以不受限制地处理该软件，包括
*不限制使用、复制、修改、合并、出版的权利，
*分发、再授权和/或销售“软件”的副本，并向
*允许获提供软件的人士这样做，但须遵守以下规定
*以下条件:
**上述版权声明和本许可声明均为
*包含在软件的所有副本或主要部分中。
**本软件是“按原样”提供的，没有任何形式的保证，
*明示或暗示的，包括但不限于保证
*适销性，适用于特定目的和不侵权。
*在任何情况下，作者或版权持有人均不承担任何责任
*不论是在合同诉讼中，索偿、损害赔偿或其他责任;
*侵权行为或其他，产生于，由于或与
*软件或有关软件的使用或其他交易。
*/

#endif
